#include "queue_wrapper.h"

// #include "esp_log.h"

static QueueHandle_t q_tx = NULL;
static QueueHandle_t q_rx = NULL;

void queue_init(void) {
  q_tx = xQueueCreate(QUEUE_LEN, MAX_STR_LEN);
  q_rx = xQueueCreate(QUEUE_LEN, MAX_STR_LEN);
  // 检查队列是否创建成功
  if (q_tx == NULL || q_rx == NULL) {
    // 如果一个创建成功而另一个失败，释放已创建的队列
    if (q_tx != NULL) {
      vQueueDelete(q_tx);
      q_tx = NULL;
    }
    if (q_rx != NULL) {
      vQueueDelete(q_rx);
      q_rx = NULL;
    }
    // 在实际应用中，这里应该有错误处理代码
  }
}

static void _push(QueueHandle_t q, const char *str) {
  // 检查队列和字符串是否有效
  if (q == NULL || str == NULL) return;

  char buffer[MAX_STR_LEN];
  strncpy(buffer, str, MAX_STR_LEN - 1);
  buffer[MAX_STR_LEN - 1] = '\0';  // 确保字符串以null结尾

  xQueueSend(q, buffer, 0);
}

static bool _pop(QueueHandle_t q, char *out, size_t max_len) {
  // 检查队列和输出参数是否有效
  if (q == NULL || out == NULL || max_len == 0) return false;

  char buffer[MAX_STR_LEN];
  if (xQueueReceive(q, buffer, 0) != pdPASS) {
    return false;
  }

  strncpy(out, buffer, max_len - 1);
  out[max_len - 1] = '\0';  // 确保字符串以null结尾
  return true;
}

void queue_tx_push(const char *str) {
  if (str == NULL) return;
  // ESP_LOGI("queue", "queue_tx_push");
  _push(q_tx, str);
}

bool queue_tx_pop(char *out, size_t max_len) {
  if (out == NULL || max_len == 0) return false;
  // ESP_LOGI("queue", "queue_tx_pop");
  return _pop(q_tx, out, max_len);
}

void queue_rx_push(const char *str) {
  if (str == NULL) return;
  // ESP_LOGI("queue", "queue_rx_push");
  _push(q_rx, str);
}

bool queue_rx_pop(char *out, size_t max_len) {
  if (out == NULL || max_len == 0) return false;
  // ESP_LOGI("queue", "queue_rx_pop");
  return _pop(q_rx, out, max_len);
}